// instanceof类型保护 构造函数来细化类型的一种方式
interface Padder {
    getPaddingString():string
}

class SpaceRepeatingPadder implements Padder {
    constructor(private numSpaces:number){}
    getPaddingString(){
        return Array(this.numSpaces+1).join(' ')
    }
    getNum(){
        return this.numSpaces
    }
}
class StringPadder implements Padder {
    constructor(private value:string){}
    getPaddingString(){
        return this.value;
    }
    getString(){
        return this.value
    }
}

function getRandomPadder(){
    return Math.random()<0.5? new SpaceRepeatingPadder(4):new StringPadder("   ")
}
// 类型为SpaceRepeatingPadder | StringPadder
let padder:Padder = getRandomPadder();

// 通过原型链 继承判断
if (padder instanceof SpaceRepeatingPadder) {
    padder.getNum; // 类型细化为'SpaceRepeatingPadder'
}
if (padder instanceof StringPadder) {
    padder.getString; // 类型细化为'StringPadder'
}